شناخت و کنترل نشاندهنده‌های LCD :

این نشاندهند‌ها با اسم Dot-Matrix-Display شناخته میشوند و همانطور که اسم آن میگوید اینها حروف یا علامت‌ها را بصورت یک ماتریکس از نقاط نشان میدهند. این ماتریکس بصورت 5x8 یا 5x11 است که استفاده‌کننده میتواند در هنگام تنظیم نشاندهنده آنرا انتخاب کند.
عدد ستون ماتریکس 5 است و عدد سطر آن 8 یا 11 بستگی به نوع علامت میباشد.(ابن ماتریکس توسط کنترلر داخلی کنترل میشود)
از دید استفاده کننده این نشاندهنده‌ها بصورت 1 سطری, 2 سطری با 4 سطری میباشند.
تعداد علامت در هر سطر از 8 تا 40 میتواند باشد.
در ساختار داخلی بستگی به اینکه تعداد علامتها در هر سطر چه تعداد باشد از یک یا دو میکروکنترلر استفاده شده. معروفترین این کنترلر‌ها HD44780 (هیتاچی) است, سازنده‌گان دیگری از کنترلر‌های دیگری استفاده میکنند ولی در عمل این کنترلر خودش را بعنوان استاندارد جا انداخته است و بقیه کارآیی مشابه این دارند.
این ال‌سی‌دی‌ها بطور کلی دارای دو نوع از حافظه هستند یکی برای علامت‌ها یا حروف است که بصورت ROM است. در این حافظه حروف ASCII بصورت یک ماتریکس 16*16 قرار دارند. آدرس ستون اول این ماتریس بصورت RAM برای استفاده کننده است .(CGRAM)
اگر سازنده آن ژاپن یا کره جنوبی یا هنگ‌کنگ باشد تعدادی از حروف الفبای آنان نیز وجود دارد.(بیت 7 از آدرس بایت)
اندازه آن برابر 240 بایت است.این حافطه (Character Generator ROM) CGROM نام دارد.
برای نوشتن در ال‌سی‌دی در واقع آدرس حروف در ماتریکس را ما به ال‌سی‌دی میفرستیم و کنترولر داخلی آن حرف یا علامت را در حافظه DDRAM قرار میدهد.
این آدرس یک بایت طول دارد و 4 بیت پایین این بایت 16 سطر ماتریکس و 4 بیت بالا 16 ستون را رمز گزاری میکند.

دومین حافظه از نوع RAM است و اندازه آن 80 بایت است در این محل علامتهایی که باید نشان داده شود قرار داده میشود.
این حافطه (Display Data RAM) DDRAM نام دارد.

اگر LCD یک سطری تنظیم شده باشد آدرس این محل
از ( 0 ... 79 ) است. 0x00h ... 0x4Fh

اگر 2 سطری باشد,
سطر اول از ( 0 ... 39 ) است. 0x00h ... 0x27h
سطر دوم از ( 64 ... 79 ) است. 0x40h ... 0x67h

در 4 سطری :
سطر 1 از ( 0 ... 19 ) 0x00h ... 0x13h
سطر 2 از ( 64 ... 83 ) 0x40h ... 0x53h
سطر 3 از ( 20 ... 39 ) 0x14h ... 0x27h
سطر 4 از ( 84 ... 79 ) 0x54h ... 0x67h

این آدرسها بطور معمول اینطور است ولی برای اطمینان باید حتما به datasheet رجوع شود.
علاوه بر این دو حافظه, در این ال‌سی‌دی‌ها برای استفاده کننده, حافظه‌ای در نظر گرفته شده که اگر مایل باشید میتوانید به دلخواه هر علامتی را که مایل باشید در این مکان ذخیره و استفاده کنید. اندازه این مکان 64 بایت است که میتوان 8 علامت 5x8 یا 4 علامت 5x11 در آن دخیره و استفاده کرد. این حافطه (Character Generator RAM) CGRAM نام دارد.
اینترفیس این ال‌سی‌دی تقریبا استاندارد شده و دارای 16 اتصال بصورت زیر است.

ترتیب این اتصالات ممکن است در ال‌سی‌دی های مختلف جابجا شود. در هر صورت برای اطمینان باید به Data sheet سازنده آن رجوع شود.
1. Vss=GND این نقطه رفرنس یا زمین است.
2. VDD ولتاژ تغذیه برای میکرو کنترولر داخلی
3. V0 ولتاژ برای تنظیم روشنایی نوشته (کنتراست)
4. (RS: Register Select) انتخاب اینکه آیا بایت قرار داده شده روی خطوط D0...D7 دستور (RS:0 Command) یا داده (RS:1 data) است.
5. (R/W: Read/Write) انتخاب اینکه از حافظه ال‌سی‌دی بخوانیم (RW:1 Read) یا در آن بنویسیم (RW:0 Write)
6. (E: Enable) انتخاب اینکه داده ها کامل است و آنها را بخواند
7...14. D0...D7 :Data Bus [Bidirection] یک بایت داده
15. (Anode) :Aَبرای روشنایی پس زمینه.
16. (Cathode) :Kبرای روشنایی پس زمینه.
اگر نشاندهنده دارای 2 کنترلر داخلی باشد( 4x20 character ) یک خط E نیز اضافه میشود که برای کنترلر دومی میباشد.

بالا پایین

زمانبندی اینترفیس برای نوشتن در ال‌سی‌دی بدین صورت است: ( نمودار 1 )



برای خواندن از داخل ال‌سی‌دی بدینضورت:




نکته مهم در دو نمودار بالا اینست که حداقل پریود خط E نباید کمتر از 1200 نانو ثانیه و طول زمانی که مثبت است نباید کمتر از 460 نانو ثانیه باشد.
نکته مهم دیگر اینکه در زمان گذر خط E از حالت High به Low داده‌ها باید ثابت باشند (هنگام نوشتن) با اینکه ثابت هسنتد و قابل قبول (هنگام خواندن).
این نکات بدون توجه به نوع کنترل نشاندهنده باید رعایت شود!

بالا پایین

روشهای کنترل :

توجه کنید:
در ادامه توضیحات ما فرض را بر این قرار میدهیم که ما فقط داده ها را به نشاندهنده میفرستیم و از داخل آن داده نمی خوانیم.
در حالتهای استفاده معمولی هم ما احتیاج نداریم که از داخل آن بخوانیم فقط مایل هستیم که نشان دهد.

این نشانده‌ها دارای دو روش کنترل هستند, یکی 8-بیتی و دیگری 4-بیتی.
در روش اول ( 8-bit Mode) از تمام خطوط (D7...D0) استفاده میشود.
در روش دوم ( 4-bit Mode) فقط از 4 بیت بالا (D7...D4) استفاده میشود.
به همین دلیل باید اول قسمت بالای بایت (most significant) و بعد قسمت پایین بایت (least significant) فرستاده شود.
در روش اول 11 خط و در دومی 7 خط اتصال لازم است. در حالت معمولی اگر نخواهیم از درون ال‌سی‌دی چیزی بخوانیم و سرعت تبادل دادها هم کم باشد میتوان از خط R/W صرفنظر کنید و آنرا به نقطه صفر یا زمین وصل میکنید. در این صورت به 10 یا حداقل به 6 اتصال نیاز میباشد.
در هر دو روش برای اینکه بدانیم LCD دستور یا داده را دریافت کرده است میتوان خط D7 (Busy-flag) را تست کرده و زمانی که حالت 1 منطقی (High) داشته باشد یعنی LCD آماده دریافت بایت بعدی میباشد.
برای اینکار باید اتصالی را که خط D7 با میکروکنترلر دارد را یعد از فرستادن بایت و کشاندن خط E به حالت صفر (LOW), در حالت ورودی (Input) قرار دهید و این اتصال را مرتب تست کنید و زمانی که بصورت High درمیاید دوباره این اتصال را در حالت خروجی (Output) قرار دهید.
اگر در برنامه خود شما دارای زمان کافی باشید, یعنی زیاد مهم نباشد که آیا LCD در 40 میکروثانیه آماده است با در 2 میلی‌ثانیه, میتوان از تست D7 صرفنظر کرد و فقط به اندازه زمانی که LCD برای اجرای آن لازم دارد صبر نمود و بایت بعدی را فرستاد.
بغیر از 2 دستور بقیه دستورات را LCD در مدت زمان تقریبا 40 میکروثانیه انجام میدهد, یعنی اگر ما بعد از فرستادن یک بایت حدود 100 میکروثانیه صبر کنیم, میتوانیم بدون تست کردن Busy-flag هم به نشاندهنده داده بقرستیم بدون اینکه خطای ارتباطی ایجاد شود.
دو دستوری که زمان زیادتری برای اجرا توسط LCD دارند یکی Clear Display و دیگری Return Home میباشند که برای اجرا به حدود 1,56 میلی‌ثانیه لازم دارند. فقط بعد از این دو دستور است که باید تقریبا 2 میلی‌ثانیه صبز کرد تا LCD آماده دریافت دستور بعدی باشد.

برای استفاده از ال‌سی‌دی باید آنرا اول تنظیم کرد. این تنظیم معمولا بدین شکل است:

1- صبر کنید تا منبع تغذیه به ولتاژ ثابتی رسیده باشد.( حدود 50 میلی‌ثانیه )
2- دستور Set Function را با گزینه‌های DL=1 میفرستیم و حدود 5 میلی ثانیه صبر میکنیم.
3- باز همان دستور را میفرستیم و حدود 1 میلی ثانیه صبر میکنیم.
4- باز همان دستور را میفرستیم و حدود 40 میکروثانیه صبر میکنیم.
5- در این زمان اگر کنترل بصورت 8-بیتی باشد Set Function را با گزینه تعداد سطر ( 1-سطری ,N=0 و یا 2-سطری ,N=1 ) و نوع ماتریکس ( F=1, 5x11 و یا F=0, 5x8 ) میفرستیم و اگر از کنترل بصورت 4-بیتی بخواهیم استفاده کنیم باید Set Function را اول فقط با گزینه نوع ارتباط ( 4-بیتی:DL=0 ) بفرستیم و بعد برای تعیین تعداد سطر ونوع ماتریکس دستور را بصورت نیم بایت‌های بالا و پایین در دو مرحله بفرستیم ( و همچنین دستورهای بعدی ! ).
از این زمان به بعد شما میتوانید بقیه تنضیمات را انجام دهید.
6- توسط دستور Mode Set باید حرکت Cursor و Display (چپ , راست) را تعیین کنید.
7- دستور Clear display برای پاک کردن پنجره نشاندهنده
8- دستور Cursor home برای بردن کرزور به نقطه صفر ( اولین علامت در قسمت بالای سمت چپ نشاندهنده )
9- دستور Display on را با برای خاموش یا روشن کردن Cursor و یا Display و تعیین نوع کرزور( خطی , بلوک )

بالا پایین

در لیست زیر این عمل را برای هر دو حالت میبینیم, در این لیست عمل تنظیم برای یک LCD 2x16 characters منظور شده.

LCD initialization
8-Bit Mode
Command Delay
Send b'00110000' = 0x30h ca. 5 mS
Send b'00110000' = 0x30h ca. 1 mS
Send b'00110000' = 0x30h > 40µS
Send b'00111000' = 0x38h
Set Function: DL=1 ;N=1 ;F=0
DL=1: Interface 8-Bit
N=1: Display line 2
F=0: Font size 5x8
> 40µS
Send b'00000110' = 0x06h
Set Mode: I/D=1 ;S=1
I/D=1: Move right (Decrement)
S=0: no Display-shift
> 40µS
Send b'00000001' = 0x01h
Clear display
ca. 1,6 mS
Send b'00000010' = 0x02h
Cursor home
ca. 1,6 mS
Send b'00001110' = 0x0Eh
Display on: D=1 ;C=1 ;B=0
D=1:Display On
C=1:Cursor On
B=0: Cursor as underlined
> 40µS
 
4-Bit Mode
Command Delay
Send b'00110000' = 0x30h ca. 5 mS
Send b'00110000' = 0x30h ca. 1 mS
Send b'00110000' = 0x30h > 40µS
Send b'00100000' = 0x20h
Set Function: DL=0
DL=0: Interface 4-Bit
> 40µS
Send b'00101000' = 0x28h
Set Function: DL=0 ;N=1 ;F=0
DL=0: Interface 4-Bit
N=1: Display line 2
F=0: Font size 5x8
1.Send High-nible: 0x02
2.Send Low-nible: 0x08
> 40µS
Send b'00000110' = 0x06h
Set Mode: I/D=1 ;S=1
I/D=1: Move right (Decrement)
S=0: no Display-shift
1.Send High-nible: 0x00
2.Send Low-nible: 0x06
> 40µS
Send b'00000001' = 0x01h
Clear display
1.Send High-nible: 0x00
2.Send Low-nible: 0x01
ca. 1,6 mS
Send b'00000010' = 0x02h
Cursor home
1.Send High-nible: 0x00
2.Send Low-nible: 0x02
ca. 1,6 mS
Send b'00001110' = 0x0Eh
Display on: D=1 ;C=1 ;B=0
D=1:Display On
C=1:Cursor On
B=0: Cursor as underlined
1.Send High-nible: 0x00
2.Send Low-nible: 0x0E
> 40µS

بعد از عمل تنظیم (initialization) نشاندهنده آماده استفاده است.
زمانهای داده شده در لیست تقریبی هستند و ممکن است برای بعضی از نشاندهنده‌ها کافی نباشد. در این صورت باید مقدار تاخیرات را بیشتر در نظر بگیرید.

بالا پایین

ارتباط بصورت روش 8-بیتی احتیاج به توضیح ندارد و آسانترین روش است.

زمان اینترفیس 4-بیتی:



زمان اینترفیس 4-بیتی:



در روش 4-بیتی هم تنها تفاوت اینست که یک بایت را باید در دو قسمت با دو سیگنال E ارسال کرد.
برای استفاده یک روش این است که تمام خطوط داده(D7...D0) و کنترل (RS/RW/E) را به میکروکنترولر وصل کنیم. این روش دارای سرعت بالا برای تبادل داده است ولی 11 پایه از میکروکنترولر مصرف میشود. روش دیگر بصورت سریال است

بالا پایین

دستورهای ال‌سی‌دی و توضیحات آن:

بالا پایین


کنترل LCD توسط shift register:
بیشتر مواقع ما برای کنترل نشاندهنده پایه‌ها با اتصالات کافی در میکروکنترلر نداریم, در این مواقع استفاده از shift register (در زبان پارسی معادل دارد؟) ضروری است. این آی‌سی انواع مختلف دارد ولی برای کار ما فقط نوعی که داده‌ها را بصورت سریال بگیرد و موازی در اختیار بگذارد مناسب است. (Seriell to Paralell)
در مدار فرکانس‌ سنج من از نوع 74HC164 استفاده کرده‌ام.
استفاده از این نوع قطعه تعداد پایه‌های لازم برای کنترل LCD را به حداقل میرساند.

در این شکل شما 4 نمونه از مدارات را میبینید که همه از Shiftregister استفاده میکنند و تفاوت آنان در تعداد پایه های لازم برای اینکار است.

LCD Mode

در اینجا من چند روش را بطور خلاصه توضیح میدهم:
در تمامی این روشها LCD بصورت 4-بیتی کنترل میشود. اگر میخواهید بصورت 8-بیتی LCD را کنترل کنید یا باید از 2 آی‌سی shift register استفاده کنید یا shift register باید از 8-بیت بزرگتر باشد, مثلا 16-بیت.
در این نوع مدارات از LCD فقط برای نوشتن و یا نشان دادن استفاده میشود (این حالتی است که معمولا کاربرد دارد). اگر مایل باشید که علامتهای داخل LCD یا حافظه داخلی را در این نوع مدار بخوانید باید از یک Shiftregister دیگر و یک یا 2 خط کنترل اضافه استفاده کنید.

روش (C):
برای کنترل ما به حداکثر 3 اتصال نیاز داریم: یکی برای داده(data), یکی takt و دیگری E ( نمودار C )
در این نوع میتوان LCD را در هر دو نوع از کنترل ( 4-bit Mode) یا ( 8-bit Mode) استفاده کنیم.
اول ما 4 یا 8 بیت داده(D7...D4) را بطور سری (serial) به آی‌سی 74HC174 منتقل میکنیم و بعد توسط خط E آنرا برای LCD فعال میکنیم.
نمودار زمانی آن بدین صورت میتواند باشد.

3 line SFR

روش (D): برای کنترل ما به حداکثر 2 اتصال نیاز داریم: برای داده(takt/data) و دیگری E. در اینجا حالت بیت R/S را همراه 4-bit داده بصورت سریال منتقل میکنیم.
در این روش LCD بصورت ( 4-bit Mode) کنترل میشود.

1 line SFR

روشهای (A) و (B): تفاوت این روشها با نوع C و D در این است که چون Busy-flag را میخوانیم باید از خط R/W نیز استفاده کنیم. برای اینکار باید بعد از اینکه داده ها به نشاندهنده منتقل شد, خط R/W را فعال کنیم () و بیت D7 را چک کنیم تا از آماده شدن LCD برای دریافت داده بعدی اطمینان حاصل کنیم.

طرز کار :

در این روشها از خاصیت شارژ و دشارژ شدن یک خازن استفاده میشود.
میدانیم که ولتاژ روی یک خازن در هنگام پر و خالی شدن از یک لگاریتم طبیعی ( ln(x) ) پیروی میکند. بنابر تعریف برای دشارژ یا خالی‌ شدن خازن داریم:
دشارژ: Uc(t) = U0. e^(-t/τ)
شارژ: Uc(t) = U0. ( 1 - e^(-t/τ) )
در این معادله Uc ولتاژ روی خازن در زمان t است,
U0 ولتاژ قرارگرفته روی خازن در زمان t=0 است که اینجا برابر ولتاژ منبع تغذیه مساوی 5 ولت میباشد.
تاو (τ) ثابت زمانی
و t زمان مشاهده.

1 line SFR

در ادامه توضیحات باید بدانیم که صفر منطقی بین 0.8 تا 1.5 ولت و یک منطقی از 3.5 ولت به بالا تعریف شده.
همانطور که در نمودار دیده میشود قبول کردن بیت‌ در Shift-Register هنگام گذر از LOW به HIGH در ورودی پالس takt یا CLK اتفاق میافتد. اگر در این زمان ولتاژ روی ورودی Data کمتر از 1.5 ولت باشد آنرا صفر منطقی میبیند و اگر بزرگتر از 3.5 ولت باشد یک منطقی.
نکته‌ای که باید در نظر داشت این است که اگر بیت مورد نظر Low باشد باید بعد از اینکه پالس CLK به حالت High رسیده, حداقل به اندازه زمان t2 صبر شود تا دوباره خازن شارژ شود!

بالا پایین


برای محاسبه مقدار مقاومت و خازن میتوان از دو راه استفاده کرد.
اولین راه اینست که خود مقدار آنان را مشخص میکنیم, بعد از آن ثابت زمانی را که برابر τ = R . C است محاسبه کرده و بر اساس آن برنامه اینترفیس را مینویسیم.
نقش مقاومت R علاوه بر تغییر ثابت زمانی مداراینست که, در زمان صفر که خازن خالی هست مانند یک محدود کننده جریان عمل میکند و باید با توجه به قدرت پین خروجی و اینکه چه مقدار جریان میتواند تحمل کند باید محاسبه یا در نظر گرفته شود.

مثال اول: فرض میکنیم R=1000 اهم و C=1µF است, بنابراین مقدار ثابت زمانی خازن τ = R.C = 1000.0,000001= 0,001 = 1mS است.
برای حالت یک منطقی باید زمانی که پالس CLK به حالت LOW میرود, خازن نباید کمتر از 3.5 ولت خالی یا دشارژ شود
بنابر تعریف برای دشارژ یا خالی‌ شدن خازن داریم:
Uc(t) = U0. e^(-t/τ)
در این معادله Uc ولتاژ روی خازن در زمان t است, U0 ولتاژ قرارگرفته روی خازن در زمان t=0 است که اینجا برابر ولتاژ منبع تغذیه مساوی 5 ولت میباشد.
تاو (τ) ثابت زمانی و t زمان مشاهده.
با مقداری جابجایی ریاضی :
(Uc/U0) = e^(-t/τ)
(Uc/U0) = e^(-t/τ)
ln(Uc/U0) = -t/τ
میتوانیم زمان را بدین صورت:
t = -τ . ln(Uc/U0) محاسبه کرد.

با قرار دادن مقادیر t = -0.001 . ln(3.5/5) = 0,356 mS خواهد بود, این برابر زمان t0 است.
برای حالت صفر منطقی, زمانی که پالس CLK به حالت LOW میرود, خازن نباید بیشتر از 0.5 ولت باشد تا بتوان با اطمینان از صفر منطقی سخن گفت.
با قرار دادن مقادیر t = -0.001 . ln(0.5/5) = 2,3 mS خواهد بود, این زمان t2 است.
و زمان t1 باید حداقل برابر t2 باشد.
حالا با داشتن این 3 زمان میتوان کد مربوط به اینترفیس سریال را نوشت.

مثال دوم:
فرض میکنیم که اوسیلاتور مدار ما 16 مگاهرتز باشد, این یعنی سیکل داخلی برابر با 4 مگاهرتز و پریود آن 250 نانوثانیه خواهد بود.
پس برای پالس CLK ما به 2 سیکل داخلی یعنی 500 نانوثانیه نیاز داریم. (1سیکل CLK را Low میکنیم و سیکل بعدی آنرا High)
این برابر زمان t0 است. در طی این زمان خازن نباید کمتر از 3.5 ولت خالی شود, پس میتوانیم مقدار ثابت زمانی را الان محاسبه کنیم.
τ = -t . ln(Uc/U0)
با قرار دادن مقادیر τ = -500 nS . ln(3,5/5) = 0,178 µS خواهد بود.
حالا میتوانیم زمان t2 را محاسبه کنیم. t2 = -0.178µS . ln(0.5/5) = 0,410 µS
با داشتن ثابت‌زمانی و انتخاب یکی از دو قطعه (یا مقاومت یا خازن) میتوان دیگری را محاسبه نمود.
اگر مقدار مقاومت را 1000 اهم بگیریم, خازن برابر است با 178,3 pF

همانطور که دیده میشود با روش دوم ما میتوانیم اینترفیس را با حداکثر سرعت برنامه‌ریزی کنیم.
در عمل شما باید تلرانس (تفاوت ارزشی) مقاومت و خازن را هم در نظر داشته باشید.

روش سوم (روش ابدایی من):

این شکل کلی مدار است.
LCD Control 3

ما اگر از یک ترانزیستور, 2 خازن و 4 مقاومت دیگر علاوه بر Shiftregister استفاده کنیم, میتوانیم حتی با یک خط اتصال این اینترفیس را عملی کنیم!
این مدار کنترل LCD با یک خط است.
این مدار ترتیب زمانی را که برای نوشتن لازم است, بر طبق ( نمودار 1 ) اتوماتیک میکند. این عمل با ظاهر شدن یک بیت در تاکت آخر اتفاق میافتد.
در مدار فرکانس سنج چون من از یک PIC دارای 8 پایه استفاده کردم, پایه های کافی برای نشاندهنده وجود نداشت بنابراین باید از حداقل پایه های ممکن استفاده میشد.
برای این مدار یک فیبر چاپی هم درست کردم و از کارکرد آن بسیار راضی!

روش سوم (روش ابدایی من):

این تصاویر مدار آزمایشی است . هم نوع دست ساز و نوع دیگر که برایش فیبرچاپی کوچکی درست کردم.

(برای بزرگتر شدن روی عکس کلیک کنید)
LCD Picture 1 LCD Picture 3 LCD Picture 4 LCD Picture 7 LCD Picture 8 LCD Picture 9 LCD Picture 10 LCD Picture 11 LCD Picture 13 LCD Picture 14

در این مدار بیت اول که وارد Shiftregister میشود همیشه 1 است و با ظاهر شدن این بیت در خروجی Shift-Register (بعد از 6 تاکت یا پالس) ترانزیستور با یک تاخیر زمانی برابر با [ τ = R2 . C2 ] روشن شده و خط E را به Low میکشد, این زمان گرفتن داده‌ها توسط LCD است. بعد از این زمان با تاخیر Shift-Register [ τ = R3.C3 ] پاک میشود و برای گرفتن بایت بعدی حاضر میشود.
از دیود میتوان صرفه جویی کرد, این فقط برای آن است که زمانهای شارژ و دشارژ تقریبا مساوی باشند.
با این روش میتوان به حداکثر سرعتی که نشاندهنده برای کار لازم دارد نیز رسید.

بالا پایین



در اینجا اول مقدار مقاومت R1 را با توجه به اینکه خروجی PIC میتواند حداکثر 20 میلی آمپر جریان در اختیار بگذارد محاسبه میکنیم.
ما در زمان صفر حداکثر جریان را به 15 میلی آمپر محدود میکنیم, بنابراین مقدار R برابر است با : ( 5V/15mA = 330R )
مقدار خازن C1 بستگی دارد به مقدار اوسیلاتور مدار و زمانبندی و تعداد دستورات در تابعی که بیت ها را بصورت سریال ارسال میکند. حال اگر فرض کنیم که اوسیلاتور ما 16 مگاهرتز باشد پس زمان سیکل داخلی ( Tcyc ) برابر 250 نانو ثانیه میباشد.این زمانی است که میکروکنترلر برای اجرای یک دستور لازم دارد(البته این زمان به چهار قسمت تقسیم میشود Q1 تا Q4 که در Q1 و Q2 دستور بعدی ضبط میشود و در Q3 و Q4 دستور فعال اجرا میشود) برای سهولت فرض میکنیم که دستور فعال در پایان این زمان( 250 نانو ثانیه) اجرا میشود.
حال به تابع ( Send_LCD_Data )نگاه میکنیم:
عملکرد این تابع بدینصورت است که 6 بیت را بصورت متوالی در روی پایه میکروکنترلر قرار میدهد.
(برای بزرگتر شدن روی عکس کلیک کنید)
   
;#################################################
;##	Send_Data-Byte to Shift-Register
;##	Char to Send in the LCD_DByte
;#################################################
Send_LCD_Data: 
1- movlw	0x06 				; 6-Bit(74LS164), b'--ddddcc', 1-Tcyc( سیکل داخلی = Tcyc )
2- movwf	LCD_Bitlen,ACCESS	; Nummber of Bit to Shift, 1-Tcyc
Send_do:	
3- rrcf		LCD_DByte,f,ACCESS	; bit in Carry, 1-Tcyc
4- bcf		PORTC,LCD_DLine,ACCESS 	; RC2:Pin13_soic28 set LOW, 1-Tcyc	
5- btfss	STATUS,C,ACCESS		; Check Carry-bit, 1-Tcyc if Carry=0, 2-Tcyc if Carry=1 and jump
6- call		Delay_ZerroBit		; if Bit=0 -> jump to delay_tau, 2-Tcyc + 21-Tcyc
7- bsf		PORTC,LCD_DLine,ACCESS	; RC2:Pin13_soic28Set HIGH, 1-Tcyc	 
8- call		Delay_ZerroBit		; wait until the capacitor is charged., 2-Tcyc + 21-Tcyc		
9- decfsz	LCD_Bitlen,f,ACCESS	; check loop counter, 1-Tcyc if NOT Zerro, 2-Tcyc if Zerro and jump
10- goto	Send_do				
11- return	
;#################################################
   
  

در سطر 1 و 2 ثابت عددی برای شمارش را مشخص میکنیم ( اینجا 6 بیت )
در سطر 3 اولین بیت را بسمت راست جابجا میکنیم. این بیت به Carry بیت منتقل میشود.
در سطر 4 پایه یا پین تعریف شده را به حالت صفر میبریم( اینجا Port C / RC2 ) . زمان اجرای این دستور 250 نانو ثانیه است.
در سطر 5 مشخص میکنیم که بیت وارد شده در Carry صفر یا یک است. این دستور بستگی به اینکه بیت صفر یا یک باشد به یک یا 2 سیکل داخلی (Tcyc) احتیاج است.
این بیت میتواند دارای دو حالت باشد:

stern

حالت اول: بیت برابر یک است
در این حالت به سطر 7 پرش میشود و به 2 Tcyc برابر 500 نانو ثانیه احتیاج است.
در سطر 7 پایه یا پین تعریف شده را به حالت یک منطقی میبریم( اینجا / RC2 Port C ). زمان اجرای این دستور 250 نانو ثانیه است.
بنابراین برای بیت یک منطقی زمان سپری شده برابر با 250nS + 500nS + 250nS = 1000 nS نانو ثانیه است و در این زمان ولتاژ روی پایه مورد نظر نباید کمتر از 3.5 ولت(حداقل ولتاژ برای یک منطقی) شود. بر اساس این زمان باید مقدار خازن C1 محاسبه شود.
Uc(t) = U0. e^( -t / τ )
τ = -t / ln( Uc(t) / U0 )
τ = -1µS / ln( 3,5V / 5V )
τ = 2,8 µS
τ = R * C
C = τ / R
C = 8,5 nF
با انتخاب نزدیکترین عدد که 10 nF است ما مقداری رزرو هم داریم.
حال با داشتن این مقادیر برای مقاومت و خازن میتوانیم ثابت زمانی را محاسبه کنیم که برابر است با : Τ = 330Ω * 10nF = 3,3 µS
با این انتخاب ثابت خازنی ما برابر با 3,3µs است و زمانی که با این مقادیر لازم است تا ولتاژ خازن به 3,5V برسد تقریبا برابر است با 1,18 µS که بیشتر از زمانی است که برای اجرای دستورات برای بیت یک منطقی مورد نیاز بود.(1000nS) و این بدین معنی است که ولتاژ روی خازن در طی مدت دستورات کمتر از 3.5 ولت نخواهد شد.

stern

حالت دوم: بیت برابر صفر است
زمانی را که لازم است تا خازن به صفر منطقی ( حداکثر 1,5V ) برسد برابر است با :
t = -τ . ln( Uc(t) / U0 )
t = -3,3 µS . ln( 1,5V / 5V )
t = 3,97 µS
برای اطمینان حد صفر منطقی را 0,8V در نظر میگیریم در این صورت :
t = -3,3 µS . ln( 0,8V / 5V )
t = 6,05 µS
از زمانی که در سطر 4 پایه یا پین مورد نظر را به صفر میکشیم تا سطر 7 که آنرا به یک منطقی تغییر میدهیم باید این زمان سپری شده باشد تا shift register آنرا صفر منطقی ببیند!

stern

حال با توجه به زمانهای محاسبه شده میتوانیم تابع تاخیری را بنویسیم که باید برابر با تاخیر برای حالت صفر منطقی باشد.
برای دقت بیشتر باید تاخیرات دستورها را نیز مدنظر داشت.
زمانهای سپری شده در دستورات برابرند با:
سطر 5 به 1 سیکل داخلی برابر 250 نانو ثانیه
در سطر 6 برای پرش ( Call ) به 2 سیکل داخلی نیاز است 500 نانو ثانیه
در تابع ( Delay_ZerroBit ) سطر 1 و 2 به 500 نانو ثانیه نیاز دارد. تاخیر در سطرهای 3 و 4 توسط شمارش معکوس ثابت Delay ایجاد میشود که برای هر شمارش به 3 سیکل داخلی برابر 750 nS نیاز است.
برای خروج هم به 2 سیکل داخلی برابر 500 nS احتیاج است.
بنابراین زمان کامل تاخیر برابر است با :
t = ( Delay * 3 * Tcyc ) + 8 * Tcyc
Delay = 6,05 µS - ( 8 * Tcyc ) / ( 3 * Tcyc )
Delay = 5,4
مقدار Delay را 6 در نظر میگیریم. با عدد 6 در مجموع, با احتساب ورود و خروج از تابع تقریبا 6,5 µS برای بیت صفر تاخیر ایچاد میکنیم.

;#############################################
;##	wait decharge time (low state)
;#############################################
Delay_ZerroBit:
1: movlw    0x06                ; 1-Tcyc
2: movwf    Delay,ACCESS        ; 1-Tcyc
do_delay:	
3: decfsz   Delay,F,ACCESS      ; 1-Tcyc if Delay NOT Zerro , 2-Tcyc if Zerro and jump
4: goto     do_delay            ; 2-Tcyc
5: return                       ; 2-Tcyc
;#########################################
 

stern

بعد از اینکار به تابعی احتیاج داریم که یک بایت را در دو قسمت به تابع Send_LCD_Data( Byte LCD_Dbyte ) ارسال کند.
اول قسمت بالای بایت و دوم قسمت پایین بایت ( 4-bit Mode) .


;#############################################
;##	send character (lcd 4-bit mode)
;#############################################
Send_Char:	
;#### Send_H_Nible ####	
swapf	CharToSend,W,ACCESS    ; CharToSend includes character	byte to send
movwf	LCD_DByte,ACCESS       ; LCD_DByte is dummy variable
rlncf	LCD_DByte,f,ACCESS
rlncf	LCD_DByte,f,ACCESS
movf	LCD_Cmd,W,ACCESS
iorwf	LCD_DByte,f,ACCESS	
call	Send_LCD_Data
;#### Send_L_Nible ####		
movf	CharToSend,W,ACCESS
movwf	LCD_DByte,ACCESS
rlncf	LCD_DByte,f,ACCESS
rlncf	LCD_DByte,f,ACCESS
movf	LCD_Cmd,W,ACCESS
iorwf	LCD_DByte,f,ACCESS	
call	Send_LCD_Data
return
;#########################################
 
نشاندهنده LCD برای اجرای دستور نوشتن ( Write data to RAM ) به تقریبا حدود 40 µS احتیاج دارد, این حداقل فاصله زمانی بین دو دستور است که باید رعایت شود.
اگر در تابع Send_Char از زمان ورود تا زمان فرستادن نیم بایت دوم Send_L_Nible تعداد دستورات با سیکل داخلی را شمارش کنیم و در نظر بگیریم که کمترین زمان در حالتی است که تمامی بیت ها دارای ارزش یک منطقی هستند میبینیم که برای فرستادن 6 بیت به 209 سیکل داخلی نیاز میباشد و این زمان با یک اوسیلاتور 16 مگاهرتزی برابر است با 209*Tcyc = 52,25 µS . بنابراین میتوانیم هر دو نیم بایت را بدون تاخیر به LCD بفرستیم زیرا این زمان از زمانی که سازنده LCD برای اجرای دستور (40 µS) در نظر گرفته بیشتر میباشد.
باید توجه کنید که این مقادیر و زمانها برای یک اوسیلاتور 16 مگاهرتزی محاسبه شده ولی از اوسیلاتور 14 تا 20 مگاهرتزی هم بدون تغییر قابل اجرا هستند, اگر از اوسیلاتوری بیشتر از 20 مگاهرتز یا کمتر از 14 مگاهرتز استفاده شود باید مقادیر خازن C1 و مقدار ثابت Delay دوباره محاسبه شود. با این مدار میتوان به سرعتی در حدود 9.5 کیلو بایت در ثانیه رسید.
در این فیلم مدار آزمایشی نشان داده میشود.

stern

امیدوارم که این پروژه برای شما مفید باشد. اگر سوالی یا پیشنهادی دارید از قسمت نظر شما استفاده کنید.

بالا